# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def isValidBST(self, root):
        """
https://leetcode.cn/problems/validate-binary-search-tree/submissions/376779062/

给你一个二叉树的根节点 root ，判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下：

节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

        :type root: TreeNode
        :rtype: bool
        """
        def isValid(root):
            if not root:
                return (True, None)
            is_left_valid = isValid(root.left)
            is_right_valid = isValid(root.right)

            if not is_left_valid[0] or not is_right_valid[0]:
                return (False, None)

            if not is_left_valid[1] and not is_right_valid[1]:
                return (True, (root.val, root.val))

            if not is_left_valid[1]:
                if root.val < is_right_valid[1][0]:
                    return (True, (root.val, is_right_valid[1][1]))
                return (False, None)

            if not is_right_valid[1]:
                if is_left_valid[1][1] < root.val:
                    return (True, (is_left_valid[1][0], root.val))
                return (False, None)

            if is_left_valid[1][1] < root.val < is_right_valid[1][0]:
                return (True, (is_left_valid[1][0], is_right_valid[1][1]))

            return (False, None)

        return isValid(root)[0]